========================================================================
	manperlb.txt					1995-10-03
========================================================================
■新しいサンプルの説明
  smpclib
    高水準Ｉ／Ｆライブラリのあるディレクトリ
    詳しくは、smpclib.doc, smpclib.ref を見てください。
  smpper7
    高水準Ｉ／Ｆライブラリの使い方のサンプル
  smpper8
    マウスの移動をトリガ情報に変換するやり方のサンプル
  smpper12
    バーチャガンのデータの読みかたのサンプル

◆ガイダンス

■ガイダンス目次
  ・基本コンセプト
  ・ＳＢＬのペリフェラルライブラリに対する高水準Ｉ／Ｆライブラリ
  ・ファイル一覧
  ・使用方法
  ・現状で対応している入力ペリフェラルデバイス
  
  注意：この高水準Ｉ／Ｆライブラリは、既存のペリフェラルライブラリを下位モ
  ジュールとして使用しています。したがって、既存のペリフェラルライブラリを
  使用する上での注意点や約束ごとなどは、この高水準Ｉ／Ｆライブラリにも適用
  されます。



■基本コンセプト
  ＳＢＬのペリフェラルライブラリが返すデータ構造を次に示す：
    struct port_t {
        struct peripheral_t {
            Uint8   type;
            Uint8   size;
            Uint8   data[m];
        } peripheral[n];
    } port[2];
    ここで m は、PER_LInit() で指定されたデータサイズ。
           n は、PER_LInit() で指定された認識可能なペリフェラルの最大数÷２。
           （ただし、m,n は常に 1 以上）
  
  ライブラリでは、上記の m,n の値がコンパイル時には決定できないために、構
  造体を使わず、単なるバイトの配列として実装している。上記の構造体を使って
  ライブラリの返すデータにアクセスしたいときには、次のようにするとよい：
    PER_LInit( PER_KD_PER, 2*n, m, port, 0 );
  
  高水準Ｉ／Ｆライブラリの基本は、要するに、こういうことである：
    「ライブラリの返すデータに構造体でアクセスしたい。」



■ＳＢＬのペリフェラルライブラリに対する高水準Ｉ／Ｆライブラリ
  現在のペリフェラルライブラリは、ＳＭＰＣからデータを得て、それをバッファ
  に入れてくれるだけで、そこから先のことはすべて自分でやらなければなりませ
  ん。例えば、下記のようなことは「トリガ情報を得る」もっとも基本的な処理で
  すが、現在のライブラリの機能だけでは、これをすべて自分で（アプリケーショ
  ン側で）やらなければなりません。
    
  「トリガ情報を得る処理
    ある位置に挿されているデバイスからペリフェラルデータを得ます。
    ＩＤをチェックして、未接続や不明なデバイスではないことを確認します。
    「ｔｈｅｎ
      ＩＤをチェックして、デバイスの種類を判断します。
      デバイスの種類に応じて、ペリフェラルデータからトリガ情報を得ます。
      （その際、「ペリフェラルデータの何バイト目のどのビットが何を意味して
      いるか」などといったことについても、自分が（アプリケーション側が）知っ
      ていなければなりません。）
      キーアサインが変更されていたら、トリガ情報を加工します。
    」
  」
  
  ここで何かに気付きませんか？
  上記の処理は、トリガ情報を得る処理だと言いました。そして、それが一般的な
  処理であるとも言いました。つまり、上記の処理をトリガ情報を得るという関数
  にしてしまえばよいのではないか、ということです。当然そのとおりです。そこ
  で、このライブラリの登場です。
  
  このライブラリは、自分ではペリフェラルデータの収集などといった物理的な処
  理は一切やりません。そういった側面は既存のペリフェラルライブラリにまかせ
  て、そこから得られたデータに対する論理的な処理だけをやります。そのため、
  現在のペリフェラルライブラリは完全に使うことができます。このライブラリは、
  新しいペリフェラルライブラリではないのですから、既存のペリフェラルライブ
  ラリと差し替えることはしません。このライブラリの機能が使いたいプロジェク
  トでは、既存のペリフェラルライブラリと共に、このライブラリもリンクしてく
  ださい。このライブラリの機能が必要ないというプロジェクトでは、何も変える
  必要はありません。従来のペリフェラルライブラリの動作は完全に保証されます。
  
  このライブラリで定義されている関数や、オブジェクトなどの詳細については、
  付属のリファレンスマニュアルやソースコードを参照してください。



■ファイル一覧
  per_1.c      高水準 I/F ライブラリのソース
  per_2.c      ３つの定数に依存する関数群
  per_3.src    PER_DisguiseTrigger() を高速化するためにアセンブラにしてある。
  
  per_x.h      高水準 I/F 機能に関する定義
  per_trg.h    トリガ情報に関する定義
  per_dev.h    一般的なデバイスに関する定義
  per_dgt.h    デジタルデバイスに関する定義
  per_anlg.h   アナログデバイスに関する定義
  per_poin.h   ポインティングデバイスに関する定義
  per_kbrd.h   キーボードデバイスに関する定義
  per_md.h     メガドライブ用デバイスに関する定義



■使用方法
  smpclib.h に定義されている３つの定数の値を適宜変更して、再コンパイルし、
  既存のペリフェラルライブラリと共にリンクして使用してください。
  これらの値から、既存のペリフェラルライブラリが使用するワークエリアのサイ
  ズを決定します。
  以下にデフォルトの設定値を示しておきます。このデフォルト値で構わない場合
  には、再コンパイルの必要はありませんので、そのままリンクして使用して頂け
  ます。
  
  _MAX_PORT
    デフォルトでは、2 に設定してあります。
    ＳＡＴＵＲＮ本体についている端子の数
    （通常は、2 に設定しておきます）
  _MAX_PERIPHERAL
    デフォルトでは、6 に設定してあります。
    １つの端子に接続可能なペリフェラルの数
    （通常は、マルチターミナルに対応するために 6 以上に設定しておきます）
  SZ_PERIPHERAL
    デフォルトでは、5 に設定してあります。
    １つのペリフェラルのデータサイズの最大
    たとえば、マウス（データサイズ==3）とデジタルパッド（データサイズ==2）
    の両方をサポートするなら、情報量の多いマウスにあわせて設定します。
    現在のところ、データサイズの最大はアナログデバイスの 5 です。
  
  □処理手順
  １．ペリフェラルＩ／Ｆの環境を初期化します。
      PER_OpenPort() をコールします。
  ２．V BLANK OUT 割り込みハンドラを登録します。
      中で PER_GetPort() をコールする V BLANK OUT 割り込みハンドラを用意し、
      それをベクタに登録します。
  ３．指定した入力ペリフェラルデバイスの情報を得ます。
      PER_GetDevice?() をコールします。
  ４．３で得た情報から、必要な情報（トリガデータなど）を取り出します。



■現状での対応／未対応な入力ペリフェラルデバイス
  □対応している入力ペリフェラルデバイス
    コントロールパッド      ＨＳＳ−０１０１
    シャトルマウス          ＨＳＳ−０１０２
    マルチターミナル６      ＨＳＳ−０１０３
    バーチャスティック      ＨＳＳ−０１０４
    レーシングコントローラ  ＨＳＳー０１１５
    
    上記ペリフェラル、上記ペリフェラルに準ずる入力ペリフェラル、あるいは、
    上記ペリフェラル互換の入力ペリフェラルに対応しています。
    
    対応しているペリフェラルタイプを以下に記しておきます。
    デジタルデバイス（ペリフェラルタイプ＝０）
      コントロールパッド、バーチャスティックなど
    アナログデバイス（ペリフェラルタイプ＝１）
      レーシングコントローラなど
    ポインティングデバイス（ペリフェラルタイプ＝２）
      シャトルマウスなど
    キーボードデバイス（ペリフェラルタイプ＝３）
      現在のところ対応する製品はありません。
    メガドライブ用デバイス（ペリフェラルタイプ＝Ｅ）
      現在のところ対応する製品はありません。
    
    注意：シャトルマウスは実際にはＳＭＰＣに対してＩＤを H'E3 と返します。
    しかし、ペリフェラルライブラリによってＩＤを加工されてしまうので、デー
    タから得られるＩＤは H'23 になります。
  
  □その他のペリフェラル
    現状で判っているものでは、「バーチャガン」「ミッションスティック」の扱
    いには注意が必要です。
    
    バーチャガン
      既存のペリフェラルライブラリでは、ポートステータスを調べることによっ
      て、それが接続されていることは確認できますが、ほかのペリフェラルのよ
      うに、データはバッファに格納されません。したがって、アプリケーション
      側は、ＳＭＰＣをダイレクトモードにしてトリガ情報を得てください。また、
      ＨＶカウンタの値も自分で直接ＶＤＰ２から得てください。
    ミッションスティック
      マルチターミナル６に対応していないので、ポートに直接接続して使用する
      ようにしてください。それ以外の場合（マルチターミナル６に接続した場合）
      には、このペリフェラルだけでなく、ほかのペリフェラルのデータも読めな
      くなる可能性があります。

◆リファレンス

■目次（関数）
  PER_GetTrigger()
    指定されたタイミングでのトリガ情報を得ます。
  PER_GetEdge()
    指定された２つのタイミングの間で変化したトリガ情報を得ます。
  PER_GetPressEdge()
    指定された２つのタイミングの間で押されたトリガ情報を得ます。
  PER_GetReleaseEdge()
    指定された２つのタイミングの間で放されたトリガ情報を得ます。
  PER_SetTriggerHandler()
    指定されたＩＤを持つペリフェラル用のトリガハンドラを登録します。
  PER_GetTriggerHandler()
    指定されたＩＤを持つペリフェラル用のトリガハンドラを得ます。
  PER_DisguiseTrigger()
    トリガ情報をアサインテーブルにしたがって変換します。
  PER_GetID()
    サターンペリフェラルＩＤを得ます。
  PER_GetType()
    ペリフェラルタイプを得ます。
  PER_GetSize()
    ペリフェラルデータのサイズを得ます。
  PER_GetAnalogXYZ()
    標準アナログデバイスのＡ／Ｄコンバータの出力値を得ます。
  PER_GetPointerXY()
    標準ポインティングデバイスの移動量を得ます。
  PER_GetKeyboardType()
    標準キーボードデバイスのタイプを得ます。



■目次（オブジェクト）
  SysDevice
    サターン標準ペリフェラルの基本型
  SysDevDigital
    サターン標準デジタルデバイス
  SysDevAnalog
    サターン標準アナログデバイス
  SysDevPointer
    サターン標準ポインティングデバイス
  SysDevKeyboard
    サターン標準キーボードデバイス
  trigger_t
    トリガ情報
  assigment_t
    トリガ情報変換テーブル（アサインテーブル）
  trigger_handler_t
    トリガハンドラ（デバイスからトリガ情報を取り出すためのハンドラ）



■関数
  □PER_GetID()
    ○synopsis
      #include  "per_x.h"
      
      id = PER_GetID( device );
      
      サターンペリフェラルＩＤを得ます。
    
    
    ○parameters
      const SysDevice   *device;
      
      デバイス情報
    
    
    ○return value
      int   id;
      
      サターンペリフェラルＩＤを返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetType()
    ○synopsis
      #include  "per_x.h"
      
      type = PER_GetType( device );
      
      ペリフェラルタイプを得ます。
    
    
    ○parameters
      const SysDevice   *device;
      
      デバイス情報
    
    
    ○return value
      int   type;
      
      ペリフェラルタイプを返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetSize()
    ○synopsis
      #include  "per_x.h"
      
      size = PER_GetSize( device );
      
      デバイスデータのサイズ（バイト数）を得ます。
    
    
    ○parameters
      const SysDevice   *device;
      
      デバイス情報
    
    
    ○return value
      int   size;
      
      デバイスデータのサイズを返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_SetTriggerHandler()
    ○synopsis
      #include  "per_x.h"
      
      PER_SetTriggerHandler( id, handler );
      
      指定のＩＤを持つペリフェラル用のトリガハンドラを設定します。
      
                ・・・・・
      ここでは「指定のＩＤを持つデバイス用のハンドラを設定している」という
      ことに注目してください。「指定のタイプ」ではありませんので、注意して
      ください。
      
      ここで設定した関数（ハンドラ）は、PER_GetTrigger() に指定のＩＤを持
      つデバイス情報が渡されたときに、コールされます。
      例としては saturn/segasmp/per/smpclib/per_x1.c の中の GetTrigerDigital()
      などを見てください。
    
    
    ○parameters
      int     id;
      trigger_handler_t  handler;
      
      <id> は、サターンペリフェラルＩＤ
      <handler> は、トリガハンドラ
    
    
    ○return value
      なし
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetTriggerHandler()
    ○synopsis
      #include  "per_x.h"
      
      handler = PER_GetTriggerHandler( id );
      
      指定のＩＤを持つペリフェラル用のトリガハンドラを得ます。
    
    
    ○parameters
      int    id;
      
      サターンペリフェラルＩＤ
    
    
    ○return value
      trigger_handler_t  handler;
      
      トリガハンドラを返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetTrigger()
    ○synopsis
      #include  "per_x.h"
      
      trigger = PER_GetTrigger( device );
      
      デバイスの種類に応じてトリガ情報を得ます。
      
      PER_SetTriggerHandler() によって登録されているＩＤを持つデバイスから
      トリガ情報を取り出すには、同じく PER_SetTriggerHandler() によって登
      録されている関数（ハンドラ）を用います。そういったものがない場合には、
      デフォルトで用意されている関数（ハンドラ）を用います。この場合、予め
      対応している入力ペリフェラルは下記のものだけですので、それ以外の入力
      ペリフェラルからトリガ情報を得たい場合には、PER_SetTriggerHandler()
      を使用してください。
      
      デフォルトで対応している入力ペリフェラル
        デジタルデバイス
          サターンペリフェラルＩＤとして 0x02 - 0x0f を返すもの
        アナログデバイス
          サターンペリフェラルＩＤとして 0x12 - 0x1f を返すもの
        ポインティングデバイス
          サターンペリフェラルＩＤとして 0x22 - 0x2f を返すもの
        キーボードデバイス
          サターンペリフェラルＩＤとして 0x33 - 0x3f を返すもの
        メガドライブ用３Ｂパッド
          サターンペリフェラルＩＤとして 0xe1 を返すもの
        メガドライブ用６Ｂパッド
          サターンペリフェラルＩＤとして 0xe2 を返すもの
        メガドライブ用マウス
          サターンペリフェラルＩＤとして 0xe3 を返すもの
    
    
    ○parameters
      const SysDevice *device;
      
      デバイス情報
    
    
    ○return value
      trigger_t  trigger;
      
      トリガ情報を返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetEdge()
    ○synopsis
      #include  "per_x.h"
      
      edge = PER_GetEdge( t1, t2 );
      
      トリガのエッジ情報を得ます。
      
      エッジ情報とは <t1> と <t2> の２つのタイミングのあいだで変化したトリ
      ガの情報のことをいいます。
    
    
    ○parameters
      trigger_t  t1;
      trigger_t  t2;
      
      <t1> と <t2> はトリガ情報。
      <t1> と <t2> の時間的な順序は問いません。
    
    
    ○return value
      trigger_t  edge;
      
      トリガのエッジ情報を返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetPressEdge()
    ○synopsis
      #include  "per_x.h"
      
      edge = PER_GetPressEdge( prev, current );
      
      トリガのプレスエッジ（押下エッジ）情報を得ます。
      
      プレスエッジ情報とは <prev> と <current> の２つのタイミングのあいだ
      にリリース状態からプレス状態に変化したトリガの情報のことをいいます。
    
    
    ○parameters
      trigger_t  prev;
      trigger_t  current;
      
      <prev> と <current> は共にトリガ情報。
      時間的に（ <prev> ＜ <current> ）という関係を期待しています。
    
    
    ○return value
      trigger_t  edge;
      
      トリガのプレスエッジ情報を返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetReleaseEdge()
    ○synopsis
      #include  "per_x.h"
      
      edge = PER_GetReleaseEdge( prev, current );
      
      トリガのリリースエッジ（解放エッジ）情報を得ます。
      
      リリースエッジ情報とは <prev> と <current> の２つのタイミングのあい
      だにプレス状態からリリース状態に変化したトリガの情報のことをいいます。
    
    
    ○parameters
      trigger_t  prev;
      trigger_t  current;
      
      <prev> と <current> は共にトリガ情報。
      時間的に（ <prev> ＜ <current> ）という関係を期待しています。
    
    
    ○return value
      trigger_t  edge;
      
      トリガのリリースエッジ情報を返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_DisguiseTrigger()
    ○synopsis
      #include  "per_x.h"
      
      trigger = PER_DisguiseTrigger( assignment, trigger );
      
      トリガ情報<trigger> をアサインテーブル<assignment> に従って変換しま
      す。<assignment> に NULL を指定すると、なんの変換もせずに <trigger>
      をそのまま返します。
      
      アサインテーブルとはトリガ情報の配列で、配列のインデックスがトリガ情
      報のビット番号に対応するテーブルのことです。
      例えば <trigger> の 0 ビット目と 4 ビット目が TRUE だった場合の戻り
      値は ( assignment[0] | assignment[4] ) になります。
      
      普通は assignment[] の各メンバには、ただ１つのトリガを対応させます。
      １つのメンバに複数のトリガを対応させた場合には、１つのトリガが押され
      ただけで、複数のトリガが押されたかのように振る舞うので注意が必要です。
    
    
    ○parameters
      const assignment_t *assignment;
      trigger_t    trigger;
      
      <assignment> は、トリガ情報のアサインテーブル
      <trigger> は、トリガ情報
      
      <assignment> に NULL を渡すと何の変換もせずに <trigger> をそのまま返
      します。
    
    
    ○return value
      trigger_t  trigger;
      
      トリガ情報を返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetAnalogXYZ()
    ○synopsis
      #include  "per_x.h"
      
      PER_GetAnalogXYZ( analog, &x, &y, &z );
      
      アナログデバイスからＸＹＺ方向のＡ／Ｄコンバータの出力値を得ます。
    
    
    ○parameters
      const SysDevAnalog *analog;
      int     *x;
      int     *y;
      int     *z;
      
      <analog> はアナログデバイス情報。
      <x> <y> <z> はそれぞれＸＹＺ方向のＡ／Ｄコンバータの出力値。
      
      <x> <y> <z> に NULL を渡すとそこには何も返されません。
      
      <x> には（右）-127 〜 +127（左）が返されます。
      <y> には（上）-127 〜 +127（下）が返されます。
      <z> には（下）-127 〜 +127（上）が返されます。
    
    
    ○return value
      なし
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetKeyboardType()
    ○synopsis
      #include  "per_x.h"
      
      type = PER_GetKeyboardType( keyboard );
      
      キーボードタイプを得ます。
    
    
    ○parameters
      const SysDevKeyboard *keyboard;
      
      キーボードデバイス情報
    
    
    ○return value
      int    type;
      
      キーボードタイプを返します。
    
    
    ○influence/reference objects
      なし
  
  
  □PER_GetPointerXY()
    ○synopsis
      #include  "per_x.h"
      
      PER_GetPointerXY( pointer, &dx, &dy );
      
      ポインティングデバイスからＸＹ方向の移動量を得ます。
      
      Ｘは右への移動が負数、左への移動が正数で表わされます。
      Ｙは上への移動が負数、下への移動が正数で表わされます。
    
    
    ○parameters
      const SysDevPointer *pointer;
      int     *dx;
      int     *dy;
      
      <pointer> はポインティングデバイス情報。
      <dx> <dy> はそれぞれＸＹ方向の移動量。
      
      <dx> <dy> に NULL を渡すとそこには何も返されません。
      
      <dx> には（右）-255 〜 255（左）が返されます。
      <dy> には（上）-255 〜 255（下）が返されます。
    
    
    ○return value
      なし
    
    
    ○influence/reference objects
      なし



■オブジェクト
  □SysDevice
    サターン標準ペリフェラルを表わすオブジェクトです。
    すべての標準ペリフェラルは、このオブジェクトから派生します。
    このオブジェクトは、ペリフェラルライブラリの返すデータそのものです。
    .type
      サターンペリフェラルタイプ
    .size
      ペリフェラルデータサイズ
    .data[]
      データ
  
  □SysDevDigital
    サターン標準デジタルデバイスを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevice を継承しています。
    すべての標準デジタルデバイスは、このオブジェクトから派生します。
    .type
      サターンペリフェラルタイプ（==TYPE_DIGITAL）
    .size
      ペリフェラルデータサイズ
    .data[]
      トリガ情報
    .expended[]
      拡張データ
  
  □SysDevAnalog
    サターン標準アナログデバイスを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevice を継承しています。
    すべての標準アナログデバイスは、このオブジェクトから派生します。
    .type
      サターンペリフェラルタイプ（==TYPE_ANALOG）
    .size
      ペリフェラルデータサイズ
    .data[]
      トリガ情報
    .ax
      Ｘ方向のＡ／Ｄコンバータの出力値（左0〜右255）
    .ay
      Ｙ方向のＡ／Ｄコンバータの出力値（上0〜下255）
    .az
      Ｚ方向のＡ／Ｄコンバータの出力値（下0〜上255）
    .expended[]
      拡張データ
  
  □SysDevPointer
    サターン標準ポインティングデバイスを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevice を継承しています。
    すべての標準ポインティングデバイスは、このオブジェクトから派生します。
    .type
      サターンペリフェラルタイプ（==TYPE_POINTER）
    .size
      ペリフェラルデータサイズ
    .status
      トリガ情報、移動量の符号、移動量のオーバーフロー。
    .dx
    .dy
      ＸＹ方向の移動量の絶対値（0〜255）
    .expended[]
      拡張データ
  
  □SysDevKeyboard
    サターン標準キーボードデバイスを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevice を継承しています。
    すべての標準キーボードデバイスは、このオブジェクトから派生します。
    .type
      サターンペリフェラルタイプ（==TYPE_KEYBOARD）
    .size
      拡張データ
    .data[]
      トリガ情報、キーボードタイプ。
    .shift
      シフトキー情報（K_CAPS,K_NUM,K_SCROLL,K_BREAK,K_MAKE）
    .c
      文字ナンバー
    .expended[]
      拡張データ
  
  □DevMD3B
    メガドライブ３ボタンパッドを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevice を継承しています。
    .type
      サターンペリフェラルタイプ（==TYPE_MD）
    .size
      ペリフェラルデータサイズ（==1）
    .data[]
      トリガ情報
  
  □DevMD6B
    メガドライブ６ボタンパッドを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevDigital を継承しています。
    .type
      サターンペリフェラルタイプ（==TYPE_MD）
    .size
      ペリフェラルデータサイズ（==2）
    .data[]
      トリガ情報
  
  □DevMDMouse
    メガドライブマウスを表わすオブジェクトです。
    このオブジェクトは、オブジェクト SysDevPointer を継承しています。
    .type
      サターンペリフェラルタイプ（==TYPE_MD）
    .size
      ペリフェラルデータサイズ（==3）
    .status
      トリガ情報、移動量の符号、移動量のオーバーフロー。
    .dx
    .dy
      ＸＹ方向の移動量の絶対値（0〜255）
  
  □trigger_t
    TRG_A       Ａボタン
    TRG_B       Ｂボタン
    TRG_C       Ｃボタン
    TRG_X       Ｘボタン
    TRG_Y       Ｙボタン
    TRG_Z       Ｚボタン
    TRG_L       Ｌボタン
    TRG_R       Ｒボタン
    TRG_UP      ↑
    TRG_DOWN    ↓
    TRG_LEFT    ←
    TRG_RIGHT   →
    TRG_START   スタートボタン
    
    標準ポインティングデバイスの  右  のボタンは TRG_A
    標準ポインティングデバイスの真ん中のボタンは TRG_C
    標準ポインティングデバイスの  左  のボタンは TRG_B
    標準ポインティングデバイスには TRG_START,A,B,C しかない。
    メガドライブ６Ｂパッドのモードボタンは TRG_R
    メガドライブ６Ｂパッドには TRG_L はない。
    メガドライブ３Ｂパッドには TRG_X,Y,Z,L,R はない。
    レーシングコントローラーには Y,Z 方向のアナログ出力はない。
    レーシングコントローラーには TRG_LEFT,RIGHT,L,R はない。
    
    TRG_MODE  メガドライブ６ボタンパッドのモードボタン
    TRG_RESET  ソフトフェアリセット
  
  □assignment_t
    メンバの順番を変更してはいけない。メンバの順番は trigger_t 用の定数
    'TRG_???' のビット並びと対応しています。
  
  □trigger_handler_t
    デバイス情報からトリガ情報を取り出す関数のこと。PER_SetTriggerHandler()
    で設定されたハンドラは、PER_GetTrigger() に指定したＩＤのデバイス情報
    が渡されたときにコールされます。
    例としては saturn/segasmp/per/smpclib/per_x1.c の中の GetTrigerDigital()
    などを見てください。

======= End of file ====================================================
